package q289;

/**
 * 289. 生命游戏
 */
public class Solution {
    /**
     * 如果活细胞周围八个位置的活细胞数少于两个，则该位置活细胞死亡；
     * 如果活细胞周围八个位置有两个或三个活细胞，则该位置活细胞仍然存活；
     * 如果活细胞周围八个位置有超过三个活细胞，则该位置活细胞死亡；
     * 如果死细胞周围正好有三个活细胞，则该位置死细胞复活；
     */
    public void gameOfLife(int[][] board) {
        int[][] nexBoard = new int[board.length][board[0].length];
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                int liveCount = 0;
                // 正上位置
                if (i - 1 >= 0 && board[i - 1][j] == 1) liveCount++;
                // 右上角位置
                if (i - 1 >= 0 && j + 1 < board[0].length && board[i - 1][j + 1] == 1) liveCount++;
                // 正右位置
                if (j + 1 < board[0].length && board[i][j + 1] == 1) liveCount++;
                // 右下位置
                if (i + 1 < board.length && j + 1 < board[0].length && board[i + 1][j + 1] == 1) liveCount++;
                // 正下位置
                if (i + 1 < board.length && board[i + 1][j] == 1) liveCount++;
                // 左下位置
                if (i + 1 < board.length && j - 1 >= 0 && board[i + 1][j - 1] == 1) liveCount++;
                // 正左位置
                if (j - 1 >= 0 && board[i][j - 1] == 1) liveCount++;
                // 左上位置
                if (j - 1 >= 0 && i - 1 >= 0 && board[i - 1][j - 1] == 1) liveCount++;

                if (board[i][j] == 1) {
                    // 活细胞
                    // 如果活细胞周围八个位置的活细胞数少于两个，则该位置活细胞死亡；
                    if (liveCount < 2 || liveCount >3) {
                        nexBoard[i][j] = 0;
                    } else {
                        nexBoard[i][j] = 1;
                    }
                } else {
                    // 死细胞
                    if (liveCount == 3) {
                        nexBoard[i][j] = 1;
                    } else {
                        nexBoard[i][j] = 0;
                    }
                }
            }
        }

        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                board[i][j] = nexBoard[i][j];
            }
        }
    }
}
